Firebird - zaokruhlovanie ceny na 0.50hal

Otázka od: martin

2. 7. 2004 1:39

Dobry den,
  mam v tabulke vypocitavane pole SUMA
  Ako na strane servera vyriesit zaokruhlovanie na .50halierov
  ak SUMA>.00 AND SUMA < .35 vysledok .00
  ak SUMA>=.35 AND SUMA < .75 vysledok .50
  ak SUMA>=.75 AND SUMA <= 1 vysledok 1.00
  Skratka podla pravidiel zaukruhlovania v SK uctovnictve.

  Treba napisat nejaku stored procedure, ktorej vstupom bude SUMA
  a vystupom ZAOKR_SUMA? Ale aky kod tej procedury?
  Neviem najst ziaden SQL prikaz na zaokruhlovanie.

  Da sa to bez UDF? A ak nie mate niekto taku UDF?

--
Martin
D7Pro,FB1.5,FibPlus



Odpovedá: Fedor 'fi0dor' Tirsel

2. 7. 2004 1:59

: Dobry den,

Zdravim,

: mam v tabulke vypocitavane pole SUMA
: Ako na strane servera vyriesit zaokruhlovanie na .50halierov
: ak SUMA>.00 AND SUMA < .35 vysledok .00
: ak SUMA>=.35 AND SUMA < .75 vysledok .50
: ak SUMA>=.75 AND SUMA <= 1 vysledok 1.00
: Skratka podla pravidiel zaukruhlovania v SK uctovnictve.
:
: Treba napisat nejaku stored procedure, ktorej vstupom bude SUMA
: a vystupom ZAOKR_SUMA? Ale aky kod tej procedury?
: Neviem najst ziaden SQL prikaz na zaokruhlovanie.
:
: Da sa to bez UDF? A ak nie mate niekto taku UDF?

islo by to samozrejme urobit uplne jednoducho cez UDF, ale na tento pripad
bohato postaci aj sql prikaz CASE.

Priklad s CASE:

  SELECT
    o.id,
    o.description,
    CASE
      WHEN (o.status IS NULL) THEN 'new'
      WHEN (o.status = 1) THEN 'confirmed'
      WHEN (o.status = 3) THEN 'in production'
      WHEN (o.status = 4) THEN 'ready'
      WHEN (o.status = 5) THEN 'shipped'
      ELSE 'unknown status ''' || o.Status || ''''
    END
  FROM orders o;

S pozdravom...
--
Fedor 'fi0dor' Tirsel
www.fi0dor.info


Odpovedá: martin

2. 7. 2004 2:19

> : mam v tabulke vypocitavane pole SUMA
> : Ako na strane servera vyriesit zaokruhlovanie na .50halierov
> : ak SUMA>>.00 AND SUMA < .35 vysledok .00
> : ak SUMA>>=.35 AND SUMA < .75 vysledok .50
> : ak SUMA>>=.75 AND SUMA <= 1 vysledok 1.00
> : Skratka podla pravidiel zaukruhlovania v SK uctovnictve.
> :
> : Treba napisat nejaku stored procedure, ktorej vstupom bude SUMA
> : a vystupom ZAOKR_SUMA? Ale aky kod tej procedury?
> : Neviem najst ziaden SQL prikaz na zaokruhlovanie.
> :
> : Da sa to bez UDF? A ak nie mate niekto taku UDF?

> islo by to samozrejme urobit uplne jednoducho cez UDF, ale na tento pripad
> bohato postaci aj sql prikaz CASE.

> Priklad s CASE:

> SELECT
> o.id,
> o.description,
> CASE
> WHEN (o.status IS NULL) THEN 'new'
> WHEN (o.status = 1) THEN 'confirmed'
> WHEN (o.status = 3) THEN 'in production'
> WHEN (o.status = 4) THEN 'ready'
> WHEN (o.status = 5) THEN 'shipped'
> ELSE 'unknown status ''' || o.Status || ''''
> END
> FROM orders o;

OK, ale ja potrebujem, aby hodnota polozky SUMA bola zaokruhlena podla
horeuvedenych pravidiel.
Cize ak zavolam SELECT ID_DOKLAD,SUMA FROM FAKTURY
vo vysledku bude zaokruhlena suma i ked je to vypocitavane pole typu
DOUBLE PRECISION

Dik

~~~
Martin


Odpovedá: Fedor 'fi0dor' Tirsel

2. 7. 2004 2:59

: OK, ale ja potrebujem, aby hodnota polozky SUMA bola zaokruhlena podla
: horeuvedenych pravidiel.
: Cize ak zavolam SELECT ID_DOKLAD,SUMA FROM FAKTURY
: vo vysledku bude zaokruhlena suma i ked je to vypocitavane pole typu
: DOUBLE PRECISION

Pisem to z hlavy, takze funkcnost nezarucujem. Kazdopadne takto nejak by sa to
mohlo uberat, pokial chcete pouzit cisto iba SQL a defaultne UDF (pomocou
vlastnej UDF by to bolo ovela prehladnejsie resp. jednoduchsie!)

SELECT id_doklad,
     CASE
       WHEN ((suma - FLOOR(suma))<0.35) THEN FLOOR(suma)
       WHEN ((suma - FLOOR(suma))>=0.35 AND (suma - FLOOR(suma)) < 0.75) THEN
FLOOR(suma) + '0.50'
       WHEN ((suma - FLOOR(suma))>=0.75) THEN CEILING(suma)
     END AS "zaokruhlena_suma"
FROM FAKTURY

S pozdravom...
--
Fedor 'fi0dor' Tirsel
www.fi0dor.info


Odpovedá: petr palicka

2. 7. 2004 7:21

ahoj,

   nikdy jsem to nakonec nepouzil, ale
melo by to fungovat. je to jedna funkce
z nasi firemni UDF. Pokud by sis s tim
nevedel rady, poslu ti cely zdrojak.

peca:

(*
/* zaokrouhleni na padesatniky */
declare external function Round50
         Double precision
         returns Double precision by value
         entry_point 'Round50' module_name 'ag_udf.dll';
*)

function Round50(var a: Double): Double; cdecl; export;
var
   i: Integer;
begin
   i:=Round(frac(a)*100);
   if i<25 then // do 25 mimo dolu
     Result:=Floor(a)
   else if i<75 then // od 25 vcetne do 75 mimo na 50
     Result:=Floor(a)+0.5 // od 75 vcetne nahoru
   else
     Result:=Floor(a)+1;
end;

Odpovedá: petr palicka

2. 7. 2004 7:19

> SELECT id_doklad,
> CASE
> WHEN ((suma - FLOOR(suma))<0.35) THEN FLOOR(suma)
> WHEN ((suma - FLOOR(suma))>=0.35 AND (suma - FLOOR(suma)) < 0.75) THEN
> FLOOR(suma) + '0.50'
> WHEN ((suma - FLOOR(suma))>=0.75) THEN CEILING(suma)
> END AS "zaokruhlena_suma"
> FROM FAKTURY

nebo tak. jen bych chtel upozornit, ze misto
.35 tam ma byt AFAIK .25 !!! teda jedna-li se
o zaokrouhlovani castky na koruny a padesatniky.

Peca

Odpovedá: Tomas Bradle

2. 7. 2004 17:26

A co takhle nejprve vynasobit 2, zaokrouhlit a vydelit 2:

SELECT CAST(CAST(2*CASTKA AS INTEGER) AS DECIMAL(9,2))/2 FROM TEST

vyzkouseno, funguje na FB 1.5

Tomas Bradle
t.bradle@worldonline.cz



----- Original Message -----
From: "petr palicka" <palicka.petr@seznam.cz>


> > SELECT id_doklad,
> > CASE
> > WHEN ((suma - FLOOR(suma))<0.35) THEN FLOOR(suma)
> > WHEN ((suma - FLOOR(suma))>=0.35 AND (suma - FLOOR(suma)) < 0.75)
THEN
> > FLOOR(suma) + '0.50'
> > WHEN ((suma - FLOOR(suma))>=0.75) THEN CEILING(suma)
> > END AS "zaokruhlena_suma"
> > FROM FAKTURY
>
> nebo tak. jen bych chtel upozornit, ze misto
> .35 tam ma byt AFAIK .25 !!! teda jedna-li se
> o zaokrouhlovani castky na koruny a padesatniky.
>